﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FTools.Dominio;
using System.Data;
using System.Data.SqlClient;
using FTools.Generico;
using System.Collections;

namespace FTools.Persistencia
{
    class PerSubProducto
    {
        static string msg = "";

        //OBTENER SUBPRODUCTO
        public SubProducto obtenerSubProducto(SqlConnection xConexion, SqlTransaction xTransaccion, long xIdSubProducto)
        {
            SubProducto objSubProducto = new SubProducto();
            PerProducto objPerProducto = new PerProducto();
            PerFabricante objPerFabricante = new PerFabricante();
            DataTable dataTable = new DataTable();
            try
            {
                SqlCommand command = new SqlCommand("select * from SUB_PRODUCTO " + 
                                                    "where ID_SUB_PRODUCTO=@IdSubProducto");

                command.Parameters.AddWithValue("@IdSubProducto", xIdSubProducto);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                if (dataTable.Rows.Count >= 0)
                {
                    DataRow fila = dataTable.Rows[0];
                    Producto objProducto = objPerProducto.obtenerProducto(xConexion, xTransaccion, (long)fila.ItemArray[7]);
                    Fabricante objFabricante = objPerFabricante.obtenerFabricante(xConexion, xTransaccion, (long)fila.ItemArray[8]);

                    objSubProducto.IdSubProducto = (long)fila.ItemArray[0];
                    objSubProducto.Codigo = (String)fila.ItemArray[1]; objSubProducto.Codigo = objSubProducto.Codigo.Trim();
                    objSubProducto.CodigoInterno = (String)fila.ItemArray[2]; objSubProducto.CodigoInterno = objSubProducto.CodigoInterno.Trim();
                    objSubProducto.CodigoProveedor = (String)fila.ItemArray[3]; objSubProducto.CodigoProveedor = objSubProducto.CodigoProveedor.Trim();
                    objSubProducto.Nombre = (String)fila.ItemArray[4]; objSubProducto.Nombre = objSubProducto.Nombre.Trim();
                    objSubProducto.Descripcion = (String)fila.ItemArray[5]; objSubProducto.Descripcion = objSubProducto.Descripcion.Trim();
                    objSubProducto.Unidad = Convert.ToDouble(fila.ItemArray[6]);
                    objSubProducto.ObjProducto = objProducto;
                    objSubProducto.ObjFabricante = objFabricante;
                    
                }
                return objSubProducto;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //EXISTE SUBPRODUCTO
        public Boolean existeSubProducto(SqlConnection xConexion, SqlTransaction xTransaccion, long xIdSubProducto)
        {
            DataTable dataTable = new DataTable();
            try
            {
                SqlCommand command = new SqlCommand("select count(*) as EXISTE from SUB_PRODUCTO " + 
                                                    "where ID_SUB_PRODUCTO=@IdSubProducto");

                command.Parameters.AddWithValue("@IdSubProducto", xIdSubProducto);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                if (dataTable.Rows.Count >= 0)
                {
                    DataRow fila = dataTable.Rows[0];
                    if ((int)fila.ItemArray[0] > 0)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //EXISTE SUBPRODUCTO
        public Boolean existeSubProducto(SqlConnection xConexion, SqlTransaction xTransaccion, String xNombre, long xIdProducto)
        {
            DataTable dataTable = new DataTable();
            try
            {
                SqlCommand command = new SqlCommand("select count(*) as EXISTE from SUB_PRODUCTO " + 
                                                    "where NOMBRE=@Nombre and ID_PRODUCTO=@IdProducto");

                command.Parameters.AddWithValue("@Nombre", xNombre.Trim());
                command.Parameters.AddWithValue("@IdProducto", xIdProducto);

                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                if (dataTable.Rows.Count >= 0)
                {
                    DataRow fila = dataTable.Rows[0];
                    if ((int)fila.ItemArray[0] > 0)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //OBTENER COLECCION SUBPRODUCTO (Por Producto)
        public ArrayList obtenerColeccionSubProducto(SqlConnection xConexion, SqlTransaction xTransaccion, long xIdProducto)
        {
            SqlDataAdapter dataAdapter;
            DataTable dataTable = new DataTable();
            ArrayList colSubProducto = new ArrayList();
            PerProducto objPerProducto = new PerProducto();
            PerFabricante objPerFabricante = new PerFabricante();
            try
            {
                SqlCommand command = new SqlCommand("select * from SUB_PRODUCTO " + 
                                                    "where ID_PRODUCTO=@IdProducto");

                command.Parameters.AddWithValue("@IdProducto", xIdProducto);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    SubProducto objSubProducto = new SubProducto();
                    DataRow fila = dataTable.Rows[i];

                    Producto objProducto = objPerProducto.obtenerProducto(xConexion, xTransaccion, (long)fila.ItemArray[7]);
                    Fabricante objFabricante = objPerFabricante.obtenerFabricante(xConexion, xTransaccion, (long)fila.ItemArray[8]);

                    objSubProducto.IdSubProducto = (long)fila.ItemArray[0];
                    objSubProducto.Codigo = (String)fila.ItemArray[1]; objSubProducto.Codigo = objSubProducto.Codigo.Trim();
                    objSubProducto.CodigoInterno = (String)fila.ItemArray[2]; objSubProducto.CodigoInterno = objSubProducto.CodigoInterno.Trim();
                    objSubProducto.CodigoProveedor = (String)fila.ItemArray[3]; objSubProducto.CodigoProveedor = objSubProducto.CodigoProveedor.Trim();
                    objSubProducto.Nombre = (String)fila.ItemArray[4]; objSubProducto.Nombre = objSubProducto.Nombre.Trim();
                    objSubProducto.Descripcion = (String)fila.ItemArray[5]; objSubProducto.Descripcion = objSubProducto.Descripcion.Trim();
                    objSubProducto.Unidad = Convert.ToDouble(fila.ItemArray[6]);
                    objSubProducto.ObjProducto = objProducto;
                    objSubProducto.ObjFabricante = objFabricante;

                    colSubProducto.Add(objSubProducto);
                }
                return colSubProducto;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //OBTENER BUSQUEDA SUBPRODUCTO (Por Producto)
        public ArrayList obtenerBusquedaSubProducto(SqlConnection xConexion, SqlTransaction xTransaccion, String xCodigo, String xCodigoInt, String xCodigoProv, String xNombre, String xDescripcion, double xUnidad, long xIdProducto, long xIdFabricante)
        {
            SqlDataAdapter dataAdapter;
            DataTable dataTable = new DataTable();
            ArrayList colSubProducto = new ArrayList();
            PerProducto objPerProducto = new PerProducto();
            PerFabricante objPerFabricante = new PerFabricante();
            try
            {
                SqlCommand command = new SqlCommand("select * from SUB_PRODUCTO " +
                                                    "where (CODIGO like @Codigo + '%' or @Codigo='') and " +
                                                    "(CODIGO_INTERNO like @CodigoInt + '%' or @CodigoInt='') and " +
                                                    "(CODIGO_PROVEEDOR like @CodigoProv + '%' or @CodigoProv='') and " +
                                                    "(NOMBRE like @Nombre + '%' or @Nombre='') and " +
                                                    "(DESCRIPCION like @Descripcion + '%' or @Descripcion='') and " +
                                                    "(UNIDAD=@Unidad or @Unidad=0) and " + 
                                                    "(ID_PRODUCTO=@IdProducto or @IdProducto=0) and " +
                                                    "(ID_FABRICANTE=@IdFabricante or @IdFabricante=0)");

                command.Parameters.AddWithValue("@Codigo", xCodigo);
                command.Parameters.AddWithValue("@CodigoInt", xCodigoInt);
                command.Parameters.AddWithValue("@CodigoProv", xCodigoProv);
                command.Parameters.AddWithValue("@Nombre", xNombre);
                command.Parameters.AddWithValue("@Descripcion", xDescripcion);
                command.Parameters.AddWithValue("@Unidad", xUnidad);
                command.Parameters.AddWithValue("@IdProducto", xIdProducto);
                command.Parameters.AddWithValue("@IdFabricante", xIdFabricante);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    SubProducto objSubProducto = new SubProducto();
                    DataRow fila = dataTable.Rows[i];

                    Producto objProducto = objPerProducto.obtenerProducto(xConexion, xTransaccion, (long)fila.ItemArray[7]);
                    Fabricante objFabricante = objPerFabricante.obtenerFabricante(xConexion, xTransaccion, (long)fila.ItemArray[8]);

                    objSubProducto.IdSubProducto = (long)fila.ItemArray[0];
                    objSubProducto.Codigo = (String)fila.ItemArray[1]; objSubProducto.Codigo = objSubProducto.Codigo.Trim();
                    objSubProducto.CodigoInterno = (String)fila.ItemArray[2]; objSubProducto.CodigoInterno = objSubProducto.CodigoInterno.Trim();
                    objSubProducto.CodigoProveedor = (String)fila.ItemArray[3]; objSubProducto.CodigoProveedor = objSubProducto.CodigoProveedor.Trim();
                    objSubProducto.Nombre = (String)fila.ItemArray[4]; objSubProducto.Nombre = objSubProducto.Nombre.Trim();
                    objSubProducto.Descripcion = (String)fila.ItemArray[5]; objSubProducto.Descripcion = objSubProducto.Descripcion.Trim();
                    objSubProducto.Unidad = Convert.ToDouble(fila.ItemArray[6]);
                    objSubProducto.ObjProducto = objProducto;
                    objSubProducto.ObjFabricante = objFabricante;

                    colSubProducto.Add(objSubProducto);
                }
                return colSubProducto;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //OBTENER BUSQUEDA SUBPRODUCTO (Por Producto)
        public ArrayList obtenerBusquedaSubProductoSimult(SqlConnection xConexion, SqlTransaction xTransaccion, String xCodigo, String xCodigoInt, String xCodigoProv, String xNombre, long xIdProducto)
        {
            SqlDataAdapter dataAdapter;
            DataTable dataTable = new DataTable();
            ArrayList colSubProducto = new ArrayList();
            PerProducto objPerProducto = new PerProducto();
            PerFabricante objPerFabricante = new PerFabricante();
            try
            {
                SqlCommand command = new SqlCommand("select * from SUB_PRODUCTO " +
                                                    "where ((CODIGO like @Codigo + '%') or " +
                                                    "(CODIGO_INTERNO like @CodigoInt + '%') or " +
                                                    "(CODIGO_PROVEEDOR like @CodigoProv + '%') or " +
                                                    "(NOMBRE like @Nombre + '%')) and " +
                                                    "(ID_PRODUCTO=@IdProducto)");

                command.Parameters.AddWithValue("@Codigo", xCodigo);
                command.Parameters.AddWithValue("@CodigoInt", xCodigoInt);
                command.Parameters.AddWithValue("@CodigoProv", xCodigoProv);
                command.Parameters.AddWithValue("@Nombre", xNombre);
                command.Parameters.AddWithValue("@IdProducto", xIdProducto);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    SubProducto objSubProducto = new SubProducto();
                    DataRow fila = dataTable.Rows[i];

                    Producto objProducto = objPerProducto.obtenerProducto(xConexion, xTransaccion, (long)fila.ItemArray[7]);
                    Fabricante objFabricante = objPerFabricante.obtenerFabricante(xConexion, xTransaccion, (long)fila.ItemArray[8]);

                    objSubProducto.IdSubProducto = (long)fila.ItemArray[0];
                    objSubProducto.Codigo = (String)fila.ItemArray[1]; objSubProducto.Codigo = objSubProducto.Codigo.Trim();
                    objSubProducto.CodigoInterno = (String)fila.ItemArray[2]; objSubProducto.CodigoInterno = objSubProducto.CodigoInterno.Trim();
                    objSubProducto.CodigoProveedor = (String)fila.ItemArray[3]; objSubProducto.CodigoProveedor = objSubProducto.CodigoProveedor.Trim();
                    objSubProducto.Nombre = (String)fila.ItemArray[4]; objSubProducto.Nombre = objSubProducto.Nombre.Trim();
                    objSubProducto.Descripcion = (String)fila.ItemArray[5]; objSubProducto.Descripcion = objSubProducto.Descripcion.Trim();
                    objSubProducto.Unidad = Convert.ToDouble(fila.ItemArray[6]);
                    objSubProducto.ObjProducto = objProducto;
                    objSubProducto.ObjFabricante = objFabricante;

                    colSubProducto.Add(objSubProducto);
                }
                return colSubProducto;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //ALTA SUBPRODUCTO
        public int altaSubProducto(SqlConnection xConexion, SqlTransaction xTransaccion, SubProducto xObjSubProducto)
        {
            try
            {
                SqlCommand command = new SqlCommand("insert into SUB_PRODUCTO " + 
                                                    "values (@IdSubProducto, @Codigo, @CodigoInterno, @CodigoProveedor, @Nombre, @Descripcion, @Unidad, @IdProducto, @IdFabricante)");

                command.Parameters.AddWithValue("@IdSubProducto", xObjSubProducto.IdSubProducto);
                command.Parameters.AddWithValue("@Codigo", xObjSubProducto.Codigo.Trim());
                command.Parameters.AddWithValue("@CodigoInterno", xObjSubProducto.CodigoInterno.Trim());
                command.Parameters.AddWithValue("@CodigoProveedor", xObjSubProducto.CodigoProveedor.Trim());
                command.Parameters.AddWithValue("@Nombre", xObjSubProducto.Nombre.Trim());
                command.Parameters.AddWithValue("@Descripcion", xObjSubProducto.Descripcion.Trim());
                command.Parameters.AddWithValue("@Unidad", xObjSubProducto.Unidad);
                command.Parameters.AddWithValue("@IdProducto", xObjSubProducto.ObjProducto.IdProducto);
                command.Parameters.AddWithValue("@IdFabricante", xObjSubProducto.ObjFabricante.IdFabricante);

                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                return command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //BAJA SUBPRODUCTO
        public int bajaSubProducto(SqlConnection xConexion, SqlTransaction xTransaccion, SubProducto xObjSubProducto)
        {
            try
            {
                SqlCommand command = new SqlCommand("delete from SUB_PRODUCTO " + 
                                                    "where ID_SUB_PRODUCTO=@IdSubProducto");

                command.Parameters.AddWithValue("@IdSubProducto", xObjSubProducto.IdSubProducto);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                return command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //MODIFICA SUBPRODUCTO
        public int modificaSubProducto(SqlConnection xConexion, SqlTransaction xTransaccion, SubProducto xObjSubProducto)
        {
            try
            {
                SqlCommand command = new SqlCommand("update SUB_PRODUCTO " +
                                                    "set CODIGO=@Codigo, CODIGO_INTERNO=@CodigoInterno, CODIGO_PROVEEDOR=@CodigoProveedor, NOMBRE=@Nombre, DESCRIPCION=@Descripcion, UNIDAD=@Unidad, ID_PRODUCTO=@IdProducto, ID_FABRICANTE=@IdFabricante " +
                                                    "where ID_SUB_PRODUCTO = @IdSubProducto");

                command.Parameters.AddWithValue("@IdSubProducto", xObjSubProducto.IdSubProducto);
                command.Parameters.AddWithValue("@Codigo", xObjSubProducto.Codigo.Trim());
                command.Parameters.AddWithValue("@CodigoInterno", xObjSubProducto.CodigoInterno.Trim());
                command.Parameters.AddWithValue("@CodigoProveedor", xObjSubProducto.CodigoProveedor.Trim());
                command.Parameters.AddWithValue("@Nombre", xObjSubProducto.Nombre.Trim());
                command.Parameters.AddWithValue("@Descripcion", xObjSubProducto.Descripcion.Trim());
                command.Parameters.AddWithValue("@Unidad", xObjSubProducto.Unidad);
                command.Parameters.AddWithValue("@IdProducto", xObjSubProducto.ObjProducto.IdProducto);
                command.Parameters.AddWithValue("@IdFabricante", xObjSubProducto.ObjFabricante.IdFabricante);

                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                return command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }
    }
}
